#include "stm32f10x.h"                  // Device header
#include "delay.h"
#define IIC_Port GPIOB
#define IIC_SCL GPIO_Pin_10
#define IIC_SDA GPIO_Pin_11

static void MyIIC_W_SCL(uint8_t value)//SCL写
{
   GPIO_WriteBit(IIC_Port,IIC_SCL,(BitAction)value);
   Delay_us(10);
}

static void MyIIC_W_SDA(uint8_t value)//SDA写
{
   GPIO_WriteBit(IIC_Port,IIC_SDA,(BitAction)value);
   Delay_us(10);
}

static uint8_t MyIIC_R_SCL(uint8_t value)//SCL读
{
   uint8_t bitvalue;
   bitvalue=GPIO_ReadInputDataBit(IIC_Port,IIC_SCL);
   Delay_us(10);
   return bitvalue;
}

static uint8_t MyIIC_R_SDA(void)//SDA读
{
   uint8_t bitvalue;
   bitvalue=GPIO_ReadInputDataBit(IIC_Port,IIC_SDA);
   Delay_us(10);
   return bitvalue;
}

void MyIIC_Init(void)
{
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//打开IO口时钟
	
   //初始化IO口
   GPIO_InitTypeDef  GPIO_InitStructure;
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;//开漏输出
   GPIO_InitStructure.GPIO_Pin=IIC_SCL|IIC_SDA;
   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
   GPIO_Init(IIC_Port,&GPIO_InitStructure);
  //拉高SCL、SDA
   GPIO_SetBits(IIC_Port,IIC_SCL);
   GPIO_SetBits(IIC_Port,IIC_SDA);	
}

void MyIIC_Start(void)//IIC通信开始位
{   
   MyIIC_W_SDA(1);//数据线拉高
   MyIIC_W_SCL(1);//时钟线拉高
   MyIIC_W_SDA(0);//数据线拉低
   MyIIC_W_SCL(0);//时钟线拉低
}

void MyIIC_SendByte(uint8_t Byte)//IIC发送一个字节
{
  int8_t i;	
  for(i=0;i<8;i++)
  {
   MyIIC_W_SDA(Byte&(0X80>>i));//放入数据
   MyIIC_W_SCL(1);//时钟线拉高，从机读取数据
   MyIIC_W_SCL(0);//时钟线拉低，等待发送下一个位
  }	//该过程循环八次
}

uint8_t MyIIC_ReadByte(void)//IIC读取一个字节
{
  uint8_t i,Byte=0x00;
  MyIIC_W_SDA(1);//释放SDA让从机可以更改SDA的电平状态	
  for(i=0;i<8;i++)
  {
	 MyIIC_W_SCL(1);//拉高SCL，读取数据位
	 if( MyIIC_R_SDA()==1 )
	 {
	   Byte|=(0x80>>i);
	 }
	  MyIIC_W_SCL(0);//时钟线拉低，允许从机放入一个位
  }	//该过程循环八次
  return Byte;
}

void MyIIC_SendACK(uint8_t ACK)//IIC发送应答位
{

   MyIIC_W_SDA(ACK);//放入数据
   MyIIC_W_SCL(1);//时钟线拉高，从机读取数据
   MyIIC_W_SCL(0);//时钟线拉低，等待发送下一个位
}

uint8_t MyIIC_ReadACK(void)//IIC读取应答位
{
  uint8_t ACK;
  MyIIC_W_SDA(1);//释放SDA，供从机发送
  MyIIC_W_SCL(1);//释放SCL，读取数据位
  ACK=MyIIC_R_SDA();
  MyIIC_W_SCL(0);
  return ACK;	
}

void MyIIC_Stop(void)//IIC通信结束位
{
   MyIIC_W_SDA(0);//数据线拉低
   MyIIC_W_SCL(1);//数据线拉高
   MyIIC_W_SDA(1);//时钟线拉高
}





